/**
 * 3.方法装饰器
 *  它会被应用到方法的属性描述符上，可以用来监视，修改或者替换方法定义
 *  方法装饰器会在运行时传入下列3个参数：
 *    1. 对于静态成员来说是类的构造函数，对于实例成员是类的原型对象
 *    2. 成员的名字
 *    3. 成员的属性描述符
 */

namespace fcLog {
  //方法装饰器1
  function get(params: any) {
    return function (target: any, methodName: any, desc: any) {
      console.log(target);
      console.log(methodName);
      console.log(desc);
    }
  }

  class HttpClient {
    public url: any | undefined;
    constructor() {

    }
    @get('http://www.itying.com')
    getData() {
      console.log(this.url)
    }
  }
  var http: any = new HttpClient();
  console.log(http.apiUrl);

  http.run();


}

namespace fcLog2 {

  // 方法装饰器2
  function get(params: any) {
    return function (target: any, methodName: any, desc: any) {
      console.log(target);
      console.log(methodName);
      console.log(desc.name);

      // 修改装饰器的方法，把装饰器方法里面传入的所有参数为string类型
      // 1. 保存当前的方法
      var oMethod = desc.value;
      desc.value = function (...args: any[]) {
        args = args.map((value) => {
          return String(value)
        })
        // console.log(args);

        oMethod.apply(this.args);
      }

    }
  }

  class HttpClient {
    public url: any | undefined;
    constructor() {

    }
    @get('http://www.itying.com')
    getData(...args: any[]) {
      console.log(args)
      console.log('我是getData里面的方法')
    }
  }
  var http: any = new HttpClient();
  http.getData(123, 'xxx')
  console.log(http.apiUrl);

}

